package io.mft.as.adapter.base;

import static org.hamcrest.CoreMatchers.nullValue;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.dianping.cat.Cat;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.Transaction;
import com.thinkive.server.Function;
import com.thinkive.server.IASContext;
import com.thinkive.server.IASRequest;
import com.thinkive.server.IASResponse;

import cn.hutool.core.util.ObjectUtil;
import io.mft.as.adapter.bean.BusConstants;
import io.mft.as.adapter.bean.DBPage;
import io.mft.as.adapter.bean.DataRow;
import io.mft.as.adapter.bean.ResultVo;
import io.mft.as.adapter.exception.BusinessException;
import io.mft.as.adapter.exception.CommonException;
import io.mft.as.adapter.exception.InvokeException;
import io.mft.as.adapter.util.ConvertHelper;
import io.mft.as.adapter.util.MapHelper;
import io.mft.commons.config.ConfigProvider;
import io.mft.dev.base.cat.CatContext;
import lombok.extern.slf4j.Slf4j;

/**
 * 描述: 版权: Copyright (c) 2007 公司: 思迪科技 作者: 易庆锋 版本: 1.0 创建日期: 2007-11-21 创建时间:
 * 12:49:53
 *
 * 修改：肖明 2015-04-13 1.处理系统入参和返回结果的日志打印 2.处理异常和异常日志 注意：
 * 1.业务代码(function中的代码)不用也不应该自己处理异常。service中由于需要手动处理事务，但建议事务处理完成后再将原异常抛出。
 * 2.建议业务代码不要自己打印日志。service中访问数据库也不用打印日志。访问其他系统的日志建议由工具类或底层包打印，实在做不到时再在service中打印。
 */
@Slf4j
public abstract class BaseFunction implements Function {

	private IASRequest request = null;

	private IASResponse response = null;

	private Map<String, String> params = new HashMap<String, String>(); // 普通参数

	private Map<String, String> sysParams = new HashMap<String, String>(); // 系统参数

	protected IASRequest getRequest() {
		return request;
	}

	protected void setRequest(IASRequest request) {
		this.request = request;
	}

	protected IASResponse getResponse() {
		return response;
	}

	protected void setResponse(IASResponse response) {
		this.response = response;
	}


	public Transaction startCat(String eventValue) {
		int use= ConfigProvider.get("system.cat.use", 1);
		if (use==0) {
			return null;
		}
		CatContext catContext = new CatContext();
		int funcNo = getRequest().getFuncNo();
		Transaction transaction = Cat.newTransaction("function", String.valueOf(funcNo));
		Cat.logEvent("function.param", this.getClass().getSimpleName(), Message.SUCCESS,eventValue);
		if (ObjectUtil.isNotEmpty(getStrParameter(Cat.Context.ROOT))) {
			catContext.addProperty(Cat.Context.ROOT, getStrParameter(Cat.Context.ROOT));
			catContext.addProperty(Cat.Context.PARENT, getStrParameter(Cat.Context.PARENT));
			catContext.addProperty(Cat.Context.CHILD, getStrParameter(Cat.Context.CHILD));
		}else {
			Cat.logRemoteCallClient(catContext);
		}
		CatContext.set(catContext);
		Cat.logRemoteCallServer(catContext);
		return transaction;
	}
	public void endCat(Transaction transaction,int errorNo,String errorMsg,String eventValue) {
		if (transaction==null) {
			return;
		}
		int use= ConfigProvider.get("system.cat.use", 1);
		if (use==0) {
			return;
		}
		try {
			if (errorNo == 0) {
				Cat.logEvent("function.result", this.getClass().getSimpleName(), Message.SUCCESS,eventValue);
			} else {
				transaction.addData("function.errorInfo", errorMsg);
				transaction.setStatus(String.valueOf(errorNo));
			}
		} catch (Throwable e) {
			log.error("", e);
		} finally {
			try {
				if (transaction != null) {
					try {
						transaction.complete();
						transaction = null;
					} catch (Throwable e2) {
						log.error("", e2);
					}
				}
				CatContext.remove();
			} catch (Exception e2) {
				log.error("", e2);
			}

		}
	}
	/**
	 * 描述：抽象方法，由子类覆写 作者：李炜 时间：Jul 9, 2013 8:55:45 PM
	 */
	public abstract ResultVo execute() throws InvokeException, Exception;

	/**
	 * 在调用相应的function方法前调用,子类可以覆盖,在进入方法前做一些处理
	 *
	 * @param function 业务功能参数
	 */
	public void before() {
	}

	/**
	 * 在调用相应的function之后调用，子类可以覆盖,在离开方法后再进行一些相应的处理
	 *
	 * @param function 业务功能参数
	 */
	public void after() {
	}

	public void after(ResultVo result) {

	}

	private void doBefore() throws Exception {
		this.before();
	}

	private void doAfter(ResultVo result) throws Exception {
		this.after(result);
		this.after();
	}

	public void setParameter(String field, String value) {
		Method m;
		try {
			m = this.request.getClass().getMethod("addFieldValue", new Class[] { String.class, String.class });
			m.invoke(this.request, new String[] { field, value });
		} catch (Exception e) {
			log.error("setParameter error", e);
		}
	}

	/**
	 * 描述： 作者：李炜 时间：Jul 10, 2013 9:36:24 AM
	 *
	 * @param context
	 */
	public void invoke(IASContext context) {
		// 初始化请求设置类加载器，解决BUS容器下通过javamail发送不了邮件问题
		Thread.currentThread().setContextClassLoader(BaseFunction.class.getClassLoader());

		this.request = context.getRequest();
		this.response = context.getResponse();
		long t1 = System.currentTimeMillis();
		// 功能号描述
		String funcDesc = "";
		// 功能号
		String funcNo = null;

		// 初始化参数
		if (this.request.getFieldCount() > 0) {
			for (int i = 0; i < this.request.getFieldCount(); i++) {
				String field = this.request.getFieldName(i);
				String value = this.request.getFieldValue(field);
				// 普通参数
				params.put(field, value);
			}
		}
		String requestId = getSysParameter(BusConstants.SYS_PARAM_REQUEST_ID);// req_id非必传

		funcNo = String.valueOf(this.request.getFuncNo());

		int errorCode = 0;// 错误号
		String errorMsg = "";// 错误消息
		Transaction transaction=null;
		try {
			String inputStr = parametersToStr();
			if (log.isInfoEnabled()) {
				// 入参转字符串
				log.info("[RequestId:{}] [FuncNo:{}] 开始", requestId, funcNo);
				log.info("[RequestId:{}] [FuncNo:{}] Request:{}", requestId, funcNo, inputStr);
			}
			transaction=startCat(inputStr);
			doBefore();
			ResultVo result = execute();
			doAfter(result);
			packet(result);
			StringBuilder outputStrBuf = resultVoToString(result);
			endCat(transaction,result.getErrorNo(),result.getErrorMsg(),outputStrBuf.toString());
			errorCode = result.getErrorNo();
			errorMsg = result.getErrorMsg();

			if (log.isInfoEnabled()) {
				// 花费时间
				long spendTime = System.currentTimeMillis() - t1;
				// 出差转字符串
				log.info("[RequestId:{}] [FuncNo:{}-{}] Response:{}结束,共花费时间:{} ms", requestId, funcNo, funcDesc,
						outputStrBuf.toString(), spendTime);
			}
			
		} catch (InvokeException e) {
			int errorType = e.getErrorType();
			errorCode = errorType >= 0 ? getErrorNo(errorType) : e.getErrorCode();// 需要兼容现有代码
			this.response.clear();
			this.response.setErrorNo(errorCode);
			this.response.setErrorInfo(e.getMessage());
			long spendTime = System.currentTimeMillis() - t1;
			StringBuilder outputStrBuf = new StringBuilder();
			outputStrBuf.append("{errorCode:\"").append(errorCode).append("\",message:\"").append(e.getMessage())
					.append("\"}");
			errorMsg = e.getMessage();
			log.error("[RequestId:{}] [FuncNo:{}-{}] Response:{}结束,共花费时间:{} ms", requestId, funcNo, funcDesc,
					outputStrBuf.toString(), spendTime);
			endCat(transaction,errorCode,errorMsg,outputStrBuf.toString());
		} catch (BusinessException e) {
			errorCode = e.getErrorCode();// 错误码
			this.response.clear();
			this.response.setErrorNo(errorCode);
			this.response.setErrorInfo(e.getMessage());
			long spendTime = System.currentTimeMillis() - t1;
			StringBuilder outputStrBuf = new StringBuilder();
			outputStrBuf.append("{errorCode:\"").append(errorCode).append("\",message:\"").append(e.getMessage())
					.append(",[提示用户]").append("系统异常,请稍后再试").append("\"}");
			log.error("[RequestId:{}] [FuncNo:{}-{}] Response:{}结束,共花费时间:{} ms", requestId, funcNo, funcDesc,
					outputStrBuf.toString(), spendTime);
			endCat(transaction,errorCode,errorMsg,outputStrBuf.toString());
		} catch (CommonException e) {
			// 与BusinessException的区别是，不会根据errorCode到配置文件中取用户提示信息
			int errorType = e.getErrorType();
			errorCode = errorType >= 0 ? getErrorNo(errorType) : errorType;
			this.response.clear();
			this.response.setErrorNo(errorCode);
			this.response.setErrorInfo(errorMsg);
			long spendTime = System.currentTimeMillis() - t1;
			StringBuilder outputStrBuf = new StringBuilder();
			outputStrBuf.append("{errorCode:\"").append(errorCode).append("\",message:\"").append(errorMsg)
					.append("\"}");
			log.error("[RequestId:{}] [FuncNo:{}-{}] Response:{}结束,共花费时间:{} ms", requestId, funcNo, funcDesc,
					outputStrBuf.toString(), spendTime);
			endCat(transaction,errorCode,errorMsg,outputStrBuf.toString());
		} catch (Throwable e) {
			this.response.clear();
			this.response.setErrorNo(BusConstants.SYSTEM_EXCEPTION);
			this.response.setErrorInfo("系统出现异常");
			long spendTime = System.currentTimeMillis() - t1;
			StringBuilder outputStrBuf = new StringBuilder();
			outputStrBuf.append("{errorCode:\"").append("\",message:\"").append(e.getMessage()).append("\"}");

			errorCode = BusConstants.SYSTEM_EXCEPTION;
			errorMsg = e.getMessage();
			log.error("[RequestId:{}] [FuncNo:{}-{}] Response:{}结束,共花费时间:{} ms", requestId, funcNo, funcDesc,
					outputStrBuf.toString(), spendTime);
			endCat(transaction,errorCode,errorMsg,outputStrBuf.toString());
		}
	}

	private String parametersToStr() {
		// 打印入参
		StringBuilder rcStrBuilder = new StringBuilder("{");
		for (int i = 0; i < this.request.getFieldCount(); i++) {
			String field = this.request.getFieldName(i);
			String value = this.request.getFieldValue(field);
			rcStrBuilder.append(field).append(":").append(value).append(",");
		}
		rcStrBuilder.deleteCharAt(rcStrBuilder.length() - 1);
		rcStrBuilder.append("}");
		return rcStrBuilder.toString();
	}

	private StringBuilder mapToString(Map<String, Object> results) {
		StringBuilder resStrBuilder = new StringBuilder();
		Set<Map.Entry<String, Object>> entrySet = results.entrySet();
		for (Map.Entry<String, Object> entry : entrySet) {
			String key = entry.getKey();
			Object value = entry.getValue();
			resStrBuilder.append("{");
			if (value instanceof DBPage) {
				DBPage page = (DBPage) value;
				resStrBuilder.append(key).append(":DBPage{");
				resStrBuilder.append("totalRows:").append(page.getTotalRows());
				resStrBuilder.append(",currentPage:").append(page.getCurrentPage());
				resStrBuilder.append(",numPerPage:").append(page.getNumPerPage());
				resStrBuilder.append(",data:").append(getLogStr(page.getData()));
				resStrBuilder.append("}");
			} else {
				resStrBuilder.append(key + ":" + getLogStr(value));
			}
			resStrBuilder.append("},");
		}
		return resStrBuilder;

	}

	// 将ResultVo转换成String，以便打印
	private StringBuilder resultVoToString(ResultVo result) {
		StringBuilder resStrBuilder = new StringBuilder();
		if (null != result) {
			resStrBuilder.append(result.getErrorNo()).append("| ");
			resStrBuilder.append(result.getErrorMsg()).append("| ");
			Map<String, Object> results = result.getResults();
			if (results != null && results.size() > 0) {
				resStrBuilder.append(mapToString(results));
				resStrBuilder.deleteCharAt(resStrBuilder.length() - 1);
			}
		}
		return resStrBuilder;
	}

	// 将Map或List<Map>转换成打印日志的字符串，并对Map中的key进行过滤。不能打印的字段，统一打印类型
	private String getLogStr(Object value) {
		if (value instanceof Map) {
			Map map = (Map) value;
			StringBuilder sb = new StringBuilder("{");
			if (map.size() > 0) {
				Set<Map.Entry> entrySet = map.entrySet();
				for (Map.Entry entry : entrySet) {
					Object keyObj = entry.getKey();
					Object valueOjb = entry.getValue();
					String keyStr;
					if (keyObj == null) {
						keyStr = "null";
					} else {
						keyStr = keyObj.toString();
					}
					sb.append(keyStr).append(":").append(getLogStr(valueOjb)).append(",");
				}
				sb.deleteCharAt(sb.length() - 1);
			}
			sb.append("}");
			return sb.toString();
		} else if (value instanceof List) {
			List list = (List) value;
			StringBuilder sb = new StringBuilder("[");
			if (!list.isEmpty()) {
				for (Object ojb : list) {
					sb.append(getLogStr(ojb)).append(",");
				}
				sb.deleteCharAt(sb.length() - 1);
			}
			sb.append("]");
			return sb.toString();
		} else {
			return value == null ? "null" : value.toString();
		}
	}

	/**
	 * 描述：返回字串Parameter,若不存在，则返回空字串 作者：李炜 时间：Jul 10, 2013 1:55:34 PM
	 *
	 * @param fieldName
	 * @return
	 */
	public String getStrParameter(String fieldName) {
		String value = request.getFieldValue(fieldName);
		return (ObjectUtil.isEmpty(value)) ? "" : value;
	}

	/**
	 *
	 * 描述：返回字串Parameter,若不存在，则返回缺省值 作者：李炜 时间：Jul 10, 2013 1:57:54 PM
	 *
	 * @param fieldName
	 * @param defaultValue
	 * @return
	 */
	public String getStrParameter(String fieldName, String defaultValue) {
		String value = request.getFieldValue(fieldName);
		return (ObjectUtil.isEmpty(value)) ? defaultValue : value;
	}

	/**
	 * 获取传入参数，并校验其是否为空。如果不需要校验则直接使用getStrParameter方法
	 * 设定参数校验错误的错误类型是0，不区分是第几个参数，其他错误从1开始编号
	 *
	 * @param key 参数字段名
	 * @return 参数值
	 */
	public String getAndCheckStrParam(String key) {
		String value = getStrParameter(key);
		if (ObjectUtil.isEmpty(value)) {
			throw new InvokeException("[" + key + "]不能为空！", 0);
		}
		return value;
	}

	/**
	 * 获取传入参数，并校验其是否为空，设定参数校验错误的错误类型是0，不区分是第几个参数，其他错误从1开始编号
	 *
	 * @param key  参数字段名
	 * @param name 参数中文名，用于错误提示
	 * @return 参数值
	 */
	public String getAndCheckStrParam(String key, String name) {
		String value = getStrParameter(key);
		if (ObjectUtil.isEmpty(value)) {
			throw new InvokeException("[" + name + "]不能为空！", 0);
		}
		return value;
	}

	/**
	 *
	 * 描述： 作者：李炜 时间：Jul 13, 2013 1:33:39 PM
	 *
	 * @param fieldName
	 * @return
	 */
	public String[] getStrArrayParameter(String fieldName) {
		String value = getStrParameter(fieldName);
		// return StringHelper.split(value, ",");//java
		// api文档，建议不使用StringTokenizer
		return value.split(",");
	}

	/**
	 * 返回整数，若不存在或转换失败，则返回0
	 *
	 * @param name
	 * @return
	 */
	@Deprecated
	public int getIntParameter(String fieldName) {
		String value = request.getFieldValue(fieldName);
		return ConvertHelper.strToInt(value);
	}

	/**
	 *
	 * 描述：返回整数，若不存在或转换失败，则返回缺省值 作者：李炜 时间：Jul 10, 2013 2:01:18 PM
	 *
	 * @param fieldName
	 * @param defaultValue
	 * @return
	 */
	@Deprecated
	public int getIntParameter(String fieldName, int defaultValue) {
		String value = request.getFieldValue(fieldName);
		if (ObjectUtil.isEmpty(value)) {
			return defaultValue;
		} else {
			return ConvertHelper.strToInt(value);
		}
	}

	/**
	 * 根据参数名得到int类型参数值
	 * 参数要求是数字，而前端传过来字母时，应该报错告诉客户端他的程序可能有问题了。所以建议废弃上面的两个getIntParameter方法
	 *
	 * @param key 参数字段名
	 * @return 参数值
	 */
	public int getAndCheckIntParam(String key) {
		String value = getAndCheckStrParam(key);
		try {
			return Integer.parseInt(value);
		} catch (NumberFormatException e) {
			throw new InvokeException("[" + key + "]不是数字！", e, 0);
		}
	}

	/**
	 * 根据参数名得到int类型参数值
	 *
	 * @param key  参数字段名
	 * @param name 参数中文名
	 * @return 参数值
	 */
	public int getAndCheckIntParam(String key, String name) {
		String value = getAndCheckStrParam(key, name);
		try {
			return Integer.parseInt(value);
		} catch (NumberFormatException e) {
			throw new InvokeException("[" + name + "]不是数字！", e, 0);
		}
	}

	/**
	 *
	 * 描述： 作者：李炜 时间：Jul 10, 2013 2:10:34 PM
	 *
	 * @return
	 *
	 *         修改：肖明 1.使用泛型 2.方法名起的有问题，建议修改一下
	 */
	public Map<String, String> getArrayParameter() {
		return params;
	}

	/**
	 *
	 * @描述: 系统参数集合
	 * @作者: liwei
	 * @创建日期: 2016年6月1日 上午9:43:09
	 * @return
	 */
	protected Map<String, String> getSysParameters() {
		return sysParams;
	}

	/**
	 *
	 * @描述: 获取系统参数值
	 * @作者: liwei
	 * @创建日期: 2016年6月1日 上午9:55:26
	 * @param key 系统参数以@sys_开头，存到内存中是去掉了@sys_的，这里的key不要带@sys_
	 * @return
	 */
	protected String getSysParameter(String key) {
		return MapHelper.getString(sysParams, key);
	}

	/**
	 *
	 * 描述：返回错误号，格式 - 功能号 错误号 作者：李炜 时间：Jul 10, 2013 10:11:56 AM
	 *
	 * @param errorType 取值范围 0-99
	 * @return
	 *
	 *         修改：肖明 1.当功能码超长或其他原因报错时，返回-999而不是0，0代表成功
	 *         2.这个方法应该只在本类中使用，子类中应该逐渐改过来，然后这个方法变成私有方法
	 */
	protected int getErrorNo(int errorType) {
		if (errorType > 100) {
			errorType = 99;
		}
		if (errorType < 0) {
			errorType = 0;
		}
		if (errorType < 10) {
			int result = ConvertHelper.strToInt("-" + request.getFuncNo() + "0" + errorType);
			return result == 0 ? BusConstants.SYSTEM_EXCEPTION : result;
		} else {
			int result = ConvertHelper.strToInt("-" + request.getFuncNo() + errorType);
			return result == 0 ? BusConstants.SYSTEM_EXCEPTION : result;
		}
	}

	/**
	 * 描述：打包结果集 目前只支持3种类型的结果集-Map<String, Object>、List<Map<String, Object>>、DBPage
	 * 其中List<Map<String, Object>>要求list中所有map的size大小相同 作者：李炜 时间：Jul 10, 2013
	 * 9:36:11 AM
	 *
	 * @param object
	 * @throws Exception
	 */
	private void packet(ResultVo result) throws Exception {
		if (result == null) {
			response.setErrorNo(BusConstants.INVOKE_FUNCTION_SUCCESS);
			response.setErrorInfo("调用成功");
		} else {
			response.setErrorNo(result.getErrorNo());
			response.setErrorInfo(result.getErrorMsg());
			Map<String, Object> results = result.getResults();
			if (results != null && !results.isEmpty()) {
				for (Iterator<String> iter = results.keySet().iterator(); iter.hasNext();) {
					String name = iter.next();
					Object object = results.get(name);
					if (object == null) {
						log.error("[" + name + "]的结果对象集为空。虽然不影响执行，但需要检查代码，不要返回空的结果集");
					} else if (object instanceof DataRow || object instanceof Map) {
						response.newDataSet();
						response.setDataSetName(name);
						packetRightResultData((Map) object);
					} else if (object instanceof List) {
						// Object>，否则会报错，另外每个Map的size必须一致，否则会数组越界
						response.newDataSet();
						response.setDataSetName(name);
						packetRightResultList((List) object);
					} else if (object instanceof DBPage) {
						packetRightResultPage(name, (DBPage) object);
					} else {
						throw new Exception("不支持的打包类型：" + object.getClass().getName());
					}
				}
			}
		}
	}

	/**
	 *
	 * @描述：打包map
	 * @作者：李炜
	 * @时间：2011-11-3 下午01:09:39
	 * @param dataRow
	 * @param response
	 * @throws Exception
	 */
	private void packetRightResultData(Map<String, Object> rowMap) throws Exception {
		List<Map<String, Object>> arrayList = new ArrayList<Map<String, Object>>();
		arrayList.add(rowMap);
		packetRightResultList(arrayList);
	}

	/**
	 *
	 * @描述：打包list
	 * @作者：李炜
	 * @时间：2011-11-3 下午01:08:06
	 * @param valueList
	 * @param response
	 * @throws Exception
	 */
	private void packetRightResultList(List<Map<String, Object>> valueList) throws Exception {
		if (valueList != null && !valueList.isEmpty()) {
			Map<String, Object> fieldMap = valueList.get(0);
			Object[] fieldArray = fieldMap.keySet().toArray();
			for (int i = 0; i < fieldArray.length; i++) {
				String fieldName = ((String) fieldArray[i]).trim();
				response.addField(fieldName);
			}
			for (Iterator<Map<String, Object>> iter = valueList.iterator(); iter.hasNext();) {
				Map<String, Object> rowMap = iter.next();
				for (int i = 0; i < fieldArray.length; i++) {
					String fieldName = ((String) fieldArray[i]).trim();
					response.addValue(MapHelper.getString(rowMap, fieldName));
				}
			}
		}
	}

	/**
	 *
	 * 描述：打包分页数据，分两个结果信返回 作者：李炜 时间：May 13, 2013 3:20:22 PM
	 *
	 * @param page
	 * @param response
	 * @throws Exception
	 */
	private void packetRightResultPage(String name, DBPage page) throws Exception {
		if (page != null) {
			// 打包第一个结果集
			response.newDataSet();
			response.setDataSetName(name + "0");
			packetRightResultList(page.getData());

			// 打包第二个结果集：分页信息
			response.newDataSet();
			response.setDataSetName(name + "1");
			Map<String, Object> pageInfo = new HashMap<String, Object>();
			pageInfo.put("page_count", page.getNumPerPage());// 一页显示记录数
			pageInfo.put("curr_page", page.getCurrentPage());// 当前页
			pageInfo.put("total_rows", page.getTotalRows());// 总记录数
			pageInfo.put("total_pages", page.getTotalPages());// 总页数
			packetRightResultData(pageInfo);

		}
	}

	/**
	 *
	 * 描述：当前页数，默认是第一页 作者：李炜 时间：May 13, 2013 3:05:32 PM
	 *
	 * @param request
	 * @return
	 *
	 *         修改：肖明 1.补全条件覆盖范围(result<0的情况) 2.建议废弃这个方法，不限制字段名称，当传入不是数组，应该报错
	 */
	public int getCurrPage() {
		String currPage = request.getFieldValue("page");// 当前页数 默认为第一页
		int result = ConvertHelper.strToInt(currPage);
		return (result <= 0) ? 1 : result;
	}

	/**
	 *
	 * 描述：一页显示记录数，默认是50条，大于1000条按系统指定值(1000条)处理 作者：李炜 时间：May 13, 2013 2:59:45 PM
	 *
	 * @param request
	 * @return
	 *
	 *         修改：肖明 1.补全条件覆盖范围(result<0的情况) 2.建议废弃这个方法，不限制字段名称，当传入不是数组，应该报错
	 */
	public int getPageCount() {
		String pageCount = request.getFieldValue("numperpage");
		int result = ConvertHelper.strToInt(pageCount);
		if (result <= 0) {
			result = BusConstants.ROW_OF_PAGE;
		} else if (result >= 1000) {
			result = 1000;
		}
		return result;
	}

}
